'title', '_aioseop_description' => 'description' ]; /** * Class constructor. * * @since 4.9.8 */ public function __construct() { add_action( 'rest_api_init', [ $this, 'register' ] ); } /** * Registers the HEAD fields. * * @since 4.9.8 * * @param string $object The object (post type or taxonomy). * @return void */ protected function registerHeadFields( $object ) { if ( ! apply_filters( 'aioseo_rest_api_disable_head', false, $object ) ) { register_rest_field( $object, 'aioseo_head', [ 'get_callback' => [ $this, 'getHead' ] ] ); } if ( ! apply_filters( 'aioseo_rest_api_disable_head_json', false, $object ) ) { register_rest_field( $object, 'aioseo_head_json', [ 'get_callback' => [ $this, 'getHeadJson' ] ] ); } } /** * Registers the breadcrumb fields. * * @since 4.9.8 * * @param string $object The object (post type or taxonomy). * @return void */ protected function registerBreadcrumbFields( $object ) { if ( ! aioseo()->options->deprecated->breadcrumbs->enable ) { return; } if ( ! apply_filters( 'aioseo_rest_api_disable_breadcrumb', false, $object ) ) { register_rest_field( $object, 'aioseo_breadcrumb', [ 'get_callback' => [ $this, 'getBreadcrumb' ] ] ); } if ( ! apply_filters( 'aioseo_rest_api_disable_breadcrumb_json', false, $object ) ) { register_rest_field( $object, 'aioseo_breadcrumb_json', [ 'get_callback' => [ $this, 'getBreadcrumbJson' ] ] ); } } /** * Returns the raw data that we would output in the HEAD for the given object. * * @since 4.9.8 * * @param array $object The object (post type or taxonomy). * @return string The raw HEAD data. */ public function getHead( $object ) { if ( apply_filters( 'aioseo_rest_api_disable', false, $object ) ) { return ''; } $this->setWpQuery( $object ); ob_start(); aioseo()->head->output(); $output = ob_get_clean(); // Add the title tag to our own comment block. $pageTitle = aioseo()->helpers->escapeRegexReplacement( aioseo()->meta->title->filterPageTitle() ); $output = preg_replace( '#()#', "$1\r\n\t\t$pageTitle", $output, 1 ); $this->restoreWpQuery(); return $output; } /** * Returns the data that we would output in the HEAD for the given object, but as JSON. * * @since 4.9.8 * * @param array $object The object (post type or taxonomy). * @return array The data (will be JSONified by the WP REST API class). */ public function getHeadJson( $object ) { if ( apply_filters( 'aioseo_rest_api_disable', false, $object ) ) { return []; } $this->setWpQuery( $object ); $keywordsInstance = new Meta\Keywords(); $keywords = $keywordsInstance->getKeywords(); $siteVerificationInstance = new Meta\SiteVerification(); $webmasterTools = $siteVerificationInstance->meta(); $miscellaneous = aioseo()->options->webmasterTools->miscellaneousVerification ?: ''; $webmasterTools['miscellaneous'] = trim( $miscellaneous ); $data = [ 'title' => aioseo()->meta->title->getTitle(), 'description' => aioseo()->meta->description->getDescription(), 'canonical_url' => aioseo()->helpers->canonicalUrl(), 'robots' => aioseo()->meta->robots->meta(), 'keywords' => $keywords, 'webmasterTools' => $webmasterTools, 'schema' => json_decode( aioseo()->schema->get() ) ]; $data = array_merge( $data, aioseo()->social->output->getFacebookMeta(), aioseo()->social->output->getTwitterMeta() ); $this->restoreWpQuery(); return $data; } /** * Returns the breadcrumb HTML. * * @since 4.9.8 * * @param array $object The object (post type or taxonomy). * @return string The HTML breadcrumb. */ public function getBreadcrumb( $object ) { if ( apply_filters( 'aioseo_rest_api_disable', false, $object ) ) { return ''; } $this->setWpQuery( $object ); $output = aioseo()->breadcrumbs->frontend->display( false ); $this->restoreWpQuery(); return $output; } /** * Returns the breadcrumb as a JSON. * * @since 4.9.8 * * @param array $object The object (post type or taxonomy). * @return array The crumbs (will be JSONified by the WP REST API class). */ public function getBreadcrumbJson( $object ) { if ( apply_filters( 'aioseo_rest_api_disable', false, $object ) ) { return []; } $this->setWpQuery( $object ); $data = []; $breadcrumbs = aioseo()->breadcrumbs->frontend->getBreadcrumbs(); foreach ( $breadcrumbs as $crumb ) { $data[] = [ 'label' => $crumb['label'], 'link' => $crumb['link'] ]; } $this->restoreWpQuery(); return $data; } /** * Checks whether the current user can edit any of our meta data. * * @since 4.9.8 * * @return bool Whether the current user is allowed to edit any of our meta data. */ protected function canEditMetaData() { return ( current_user_can( 'aioseo_page_general_settings' ) || current_user_can( 'aioseo_page_social_settings' ) || current_user_can( 'aioseo_page_schema_settings' ) || current_user_can( 'aioseo_page_advanced_settings' ) ); } /** * Removes internal fields from the meta data. * * @since 4.9.8 * * @param array $data The data. * @return array The modified data. */ protected function removeInternalFields( $data ) { foreach ( $this->internalFields as $internalField ) { unset( $data[ $internalField ] ); } return $data; } /** * Sets the given object as the queried object of the main query. * * @since 4.9.8 * * @param array $object The post object. * @return void */ abstract protected function setWpQuery( $object ); /** * Restores the main query back to the original query. * * @since 4.9.8 * * @return void */ protected function restoreWpQuery() { if ( null === $this->originalQuery ) { return; } global $wp_query; // phpcs:ignore Squiz.NamingConventions.ValidVariableName $wp_query = clone $this->originalQuery; // phpcs:ignore Squiz.NamingConventions.ValidVariableName $this->originalQuery = null; } }